﻿#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;

//数组和结构体使用{}进行初始化
//struct point
//{
//	int _x;
//	int _y;
//};
//
//int main()
//{
//	// C++98⽀持的
//	//结构体
//	point p = {11, 12};
//	//数组
//	int array1[] = { 1, 2, 3, 4, 5 };
//
//	return 0;
//}

// c++11中的方括号{}
//class Date
//{
//public :
//	Date(int year = 1, int month = 1, int day = 1)
//		: _year(year)
//		, _month(month)
//		, _day(day)
//	{
//		cout << "Date(int year, int month, int day)" << endl;
//	} 
//	Date(const Date& d)
//		: _year(d._year)
//		, _month(d._month)
//		, _day(d._day)
//	{
//		cout << "Date(const Date& d)" << endl;
//	}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	// C++11支持{}初始化内置类型
//	double db = { 12.00 };
//	int i = 1;	
//	// ...
//	// c++11支持自定义类型
//	Date d1 = { 2021, 11, 12 };
//
//	//直接使用构造，而不是先构造之后再调用赋值构造
//	const Date& d2 = { 2025, 07, 30 };
//
//	// 可以直接省略掉{}的写法
//	Date d4{ 3030 };	
//
//	// 不⽀持，只有{}初始化，才能省略=
//	// Date d8 2025;
//
//	//自定义类型也是
//	int i2{ 12 };
//	char ch{ 'c' };
//	
//	//c++11支持的单参数构造的另一种写法
//	Date d3 = 2026;
//		
//	// 应用场景，匿名对象直接传递参
//	vector<Date> v;
//
//	// 构造加拷贝构造
//	v.push_back({ 2021, 03, 01 });
//
//	return 0;
//}



//C++11
//
//int main()
//{
//	//这里是直接调用构造
//	std::vector<int> v({ 1, 2, 3, 4, 5, 6, 7 });
//	// 本质是构造+拷贝构造，但是编译器优化之后就是直接构造了
//	std::vector<int> v2 = { 1, 2, 3, 4, 5, 6, 7 };
//
//	// initializer_list构造一个数组对象
//	std::initializer_list<char> li = {'1', '2', '3'};
//	std::initializer_list<char>::iterator it = li.begin();
//	for (auto e : li)
//	{
//		std::cout << e << " ";
//	}
//
//	//这里既使用了pair对象的构造，又使用了initializer_list构造
//	map<string, string> dict = { {"str1", "str2"}, {"new1", "new2"} };
//
//	//initializer_list支持的赋值写法
//	v = { 1,2,3,19,90 };
//
//
//	return 0;
//}	

//// C++11
//// 左值和右值
//
//int main()
//{
//	//左值
//	int b = 1;
//	int* p = new int(0);
//	const int c = b;
//	*p = 12;
//	string s("1234556");
//	s[0] = 'x';
//	//可以取地址
//	cout << &c << endl;
//	cout << (void* ) & s[0] << endl;
//
//	//右值
//	//不可以取地址
//	10;		//常量
//	int x = 0;
//	int y = 1;
//	//x + y;		//产生的临时对象
//	//fmin：返回其参数中较小的一个
//	//fmin(x, y);	//产生临时对象
//	string("variable");	//构造的临时对象
//
//	//cout << &10 << endl;
//	//cout << &(x+y) << endl;
//	//cout << &fmin(x, y) << endl;
//	cout << &string("variable") << endl;		// error C2102: “&”要求左值
//		
//	return 0;
//}


////左值引用和右值引用
//int main()
//{
//	int b = 1;
//	int* p = new int(0);
//	const int c = b;
//	*p = 12;
//	string s("1234556");
//	s[0] = 'x';
//	//可以取地址
//	cout << &c << endl;
//	cout << (void* ) & s[0] << endl;
//
//	//左值引用，左值引用给左值起别名
//	int& r1 = b;
//	int*& r2 = p;
//	int& r3 = *p;
//	string& r4 = s;
//	char& r5 = s[0];
//
//	//右值引用给右值起别名
//	int&& rr1 = 10;
//	double x = 1.1, y = 2.2;
//	double&& rr = x + y;
//	const double& rx3 = fmin(x, y);
//	const string& rx4 = string("11111");
//
//	// 右值引⽤不能直接引⽤左值，但是右值引⽤可以引⽤move(左值)
//	int&& rrr1 = move(b);
//	double dx = 1.1, dy = 2.2;
//	double&& rrr2 = move(*p);
//	const double& rxr1 = move(x);
//	const string& rxr2 = move(s);
//
//	// b、r1、rr1都是变量表达式，都是左值,都可以取地址
//	cout << &b << endl;
//	cout << &r1 << endl;
//	cout << &rr1 << endl;
//
//	//本质是一样的，引用不改变值的属性
//	int& r6 = r1;
//	// int&& rrx6 = rr1;
//	int&& rrx6 = move(rr1);
//
//	return 0;
//}

// 引用延长生命周期
int main()
{
	//左值引用时，s的生命周期跟随者rs1，rs1销毁，s才销毁。
	std::string s = "eat";
	//string& rs1 = s;

	//右值引用时
	int x = 1;
	int y = 2;
	//x+y产生的临时对象被引用之后，生命周期随着r结束。
	//int&& r = x + y;


	return 0;
}


	